home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / db / esm-3.1 / esm-3 / usr / local / sm / src / serverlib / log / undoAction.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-05  |  9.2 KB  |  365 lines

  1. /*
  2.  *   $RCSfile: undoAction.c,v $  
  3.  *   $Revision: 1.1.1.1 $  
  4.  *   $Date: 1996/05/04 21:55:50 $      
  5.  */ 
  6. /**********************************************************************
  7. * EXODUS Database Toolkit Software
  8. * Copyright (c) 1991 Computer Sciences Department, University of
  9. *                    Wisconsin -- Madison
  10. * All Rights Reserved.
  11. *
  12. * Permission to use, copy, modify and distribute this software and its
  13. * documentation is hereby granted, provided that both the copyright
  14. * notice and this permission notice appear in all copies of the
  15. * software, derivative works or modified versions, and any portions
  16. * thereof, and that both notices appear in supporting documentation.
  17. *
  18. * THE COMPUTER SCIENCES DEPARTMENT OF THE UNIVERSITY OF WISCONSIN --
  19. * MADISON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION.  
  20. * THE DEPARTMENT DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES
  21. * WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
  22. *
  23. * The EXODUS Project Group requests users of this software to return 
  24. * any improvements or extensions that they make to:
  25. *
  26. *   EXODUS Project Group 
  27. *     c/o David J. DeWitt and Michael J. Carey
  28. *   Computer Sciences Department
  29. *   University of Wisconsin -- Madison
  30. *   Madison, WI 53706
  31. *
  32. *     or exodus@cs.wisc.edu
  33. *
  34. * In addition, the EXODUS Project Group requests that users grant the 
  35. * Computer Sciences Department rights to redistribute these changes.
  36. **********************************************************************/
  37.  
  38. #include "sysdefs.h"
  39. #include "ess.h"
  40. #include "checking.h"
  41. #include "trace.h"
  42. #include "error.h"
  43. #include "list.h"
  44. #include "pool.h"
  45. #include "tid.h"
  46. #include "io.h"
  47. #include "lock.h"
  48. #include "object.h"
  49. #include "msgdefs.h"
  50. #include "thread.h"
  51. #include "semaphore.h"
  52. #include "latch.h"
  53. #include "link.h"
  54. #include "lsn.h"
  55. #include "bf.h"
  56. #include "volume.h"
  57. #include "openlog.h"
  58. #include "log.h"
  59. #include "trans.h"
  60. #include "logrecs.h"
  61. #include "logaction.h"
  62. #include "undo.h"
  63. #include "threadstate.h"
  64. #include "io_logfuncs.h"
  65. #include "bf_extfuncs.h"
  66. #include "util_funcs.h"
  67. #include "log_intfuncs.h"
  68. #include "log_extfuncs.h"
  69. #include "thread_funcs.h"
  70. #include "undo_extfuncs.h"
  71. #include "thread_globals.h"
  72. #include "log_globals.h"
  73. #include "trans_globals.h"
  74.  
  75.  
  76.  void
  77. undoAction (
  78.  
  79.     register LOGRECORDHDR    *recordHeader 
  80. )
  81. {
  82.  
  83.  
  84.     TRPRINT(TR_LOG|TR_RECOVER, TR_LEVEL_1, ("ACTION:%d", recordHeader->action));
  85.  
  86.     if(CHECK_LOGRECORD_MAGIC( recordHeader)) {
  87.         SM_ERROR(TYPE_FATAL, esmINTERNAL);
  88.     }
  89.  
  90.     /*
  91.      *    take action based on type of record
  92.      */
  93.     switch (recordHeader->type)    {
  94.  
  95.         case LOG_REC_TYPE_USER:
  96.         case LOG_REC_TYPE_USER_COMPENSATION:
  97.  
  98.             /*
  99.              *    check to see if this is a redo only action
  100.              */
  101.             if (recordHeader->flags & REDO_ONLY)    {
  102.  
  103.                 TRPRINT(TR_LOG, TR_LEVEL_2, ("redo only record"));
  104.                 return;
  105.             }
  106.  
  107.             /*
  108.              *    call the undo action
  109.              */
  110.             switch (recordHeader->action)    {
  111.  
  112.                 case LOG_ACTION_INSERT_FILE_KEY:
  113.  
  114.                     undoFileKeyInsert(recordHeader);
  115.                     TRACE(TR_LOG|TR_RECOVER, TR_LEVEL_2);
  116.                     break;
  117.  
  118.                 case LOG_ACTION_DELETE_FILE_KEY:
  119.  
  120.                     undoFileKeyDelete(recordHeader);
  121.                     TRACE(TR_LOG|TR_RECOVER, TR_LEVEL_2);
  122.                     break;
  123.  
  124.                 case LOG_ACTION_INSERT_FILE_KEY_DONE:
  125.                     undoFileKeyInsertDone(recordHeader);
  126.                     TRACE(TR_LOG|TR_RECOVER, TR_LEVEL_2);
  127.                     break;
  128.                     
  129.                 case LOG_ACTION_FILE_ADD_SLOTTED:
  130.  
  131.                     undoFileAddSlotted(recordHeader);
  132.                     TRACE(TR_LOG|TR_RECOVER, TR_LEVEL_2);
  133.                     break;
  134.  
  135.                 case LOG_ACTION_SET_ROOTENTRY:
  136.  
  137.                     undoSetRootEntry(recordHeader);
  138.                     TRACE(TR_LOG|TR_RECOVER, TR_LEVEL_2);
  139.                     break;
  140.  
  141.                 case LOG_ACTION_REMOVE_ROOTENTRY:
  142.  
  143.                     undoRemoveRootEntry(recordHeader);
  144.                     TRACE(TR_LOG|TR_RECOVER, TR_LEVEL_2);
  145.                     break;
  146.  
  147.                 case LOG_ACTION_FILE_CREATE_DONE:
  148.  
  149.                     TRPRINT(TR_LOG|TR_RECOVER, TR_LEVEL_2, ("LOGICAL_FILE_CREATE"));
  150.                     undoFileCreateDone(recordHeader);
  151.                     break;
  152.  
  153.                 case LOG_ACTION_LOGICAL_FILE_DESTROY:
  154.  
  155.                     TRPRINT(TR_LOG|TR_RECOVER, TR_LEVEL_2, ("LOGICAL_FILE_DESTROY"));
  156.                     break;
  157.  
  158.                 case LOG_ACTION_ALLOCATE_PAGE:
  159.  
  160.                     undoPageAllocation(recordHeader);
  161.                     break;
  162.  
  163.                 case LOG_ACTION_DEALLOCATE_PAGE:
  164.  
  165.                     undoPageDeallocation(recordHeader);
  166.                     break;
  167.  
  168.                 case LOG_ACTION_MARK_FILE_PAGE:
  169.                 case LOG_ACTION_MARK_SLOTTED_PAGE:
  170.                 case LOG_ACTION_UNMARK_FILE_PAGE:
  171.                 case LOG_ACTION_UNMARK_SLOTTED_PAGE:
  172.  
  173.                     undoPageMark(recordHeader);
  174.                     break;
  175.                 case LOG_ACTION_LARGE_OBJ_ON_PAGE:
  176.  
  177.                     undoMarkLargeObjOnPage(recordHeader);
  178.                     break;
  179.  
  180.  
  181.                 case LOG_ACTION_WRITE_SMALL_OBJ:
  182.                 case LOG_ACTION_WRITE_SMALL_OBJ_ND:
  183.                     undoWriteSmallObj(recordHeader);
  184.                     break;
  185.  
  186.                 case LOG_ACTION_CREATE_SMALL_OBJ:
  187.                 case LOG_ACTION_CREATE_SMALL_OBJ_ND:
  188.                     undoCreateSmallObj(recordHeader);
  189.                     break;
  190.  
  191.                 case LOG_ACTION_DESTROY_SMALL_OBJ:
  192.                 case LOG_ACTION_DESTROY_SMALL_OBJ_ND:
  193.                     undoDestroySmallObj(recordHeader);
  194.                     break;
  195.  
  196.                 case LOG_ACTION_INSERT_SMALL_OBJ:
  197.                 case LOG_ACTION_INSERT_SMALL_OBJ_ND:
  198.                     undoInsertSmallObj(recordHeader);
  199.                     break;
  200.  
  201.                 case LOG_ACTION_APPEND_SMALL_OBJ:
  202.                 case LOG_ACTION_APPEND_SMALL_OBJ_ND:
  203.                     undoAppendSmallObj(recordHeader);
  204.                     break;
  205.  
  206.                 case LOG_ACTION_DELETE_SMALL_OBJ:
  207.                 case LOG_ACTION_DELETE_SMALL_OBJ_ND:
  208.                     undoDeleteSmallObj(recordHeader);
  209.                     break;
  210.  
  211.                 case LOG_ACTION_FORWARD_SMALL_OBJ:
  212.                     undoForwardSmallObj(recordHeader);
  213.                     break;
  214.  
  215.                 case LOG_ACTION_CHANGE_SMALL_OBJHDR:
  216.                     undoChangeSmallObjHdr(recordHeader);
  217.                     break;
  218.  
  219.                 case LOG_ACTION_WRITE_LARGE_DATA:
  220.                 case LOG_ACTION_WRITE_LARGE_DATA_ND:
  221.                     undoWriteLargeData(recordHeader);
  222.                     break;
  223.  
  224.                 case LOG_ACTION_APPEND_LARGE_DATA:
  225.                 case LOG_ACTION_APPEND_LARGE_DATA_ND:
  226.                     undoAppendLargeData(recordHeader);
  227.                     break;
  228.  
  229.                 case LOG_ACTION_REMOVE_LARGE_DATA:
  230.                     undoRemoveLargeData(recordHeader);
  231.                     break;
  232.  
  233.                 case LOG_ACTION_INSERT_LARGE_DATA:
  234.                 case LOG_ACTION_INSERT_LARGE_DATA_ND:
  235.                     undoInsertLargeData(recordHeader);
  236.                     break;
  237.  
  238.                 case LOG_ACTION_DELETE_LARGE_DATA:
  239.                     undoDeleteLargeData(recordHeader);
  240.                     break;
  241.  
  242.                 case LOG_ACTION_INIT_LARGE_NODE:
  243.                     /* Do nothing */
  244.                     break;
  245.  
  246.                 case LOG_ACTION_WRITE_LARGE_NODE:
  247.                     undoWriteLargeNode(recordHeader);
  248.                     break;
  249.  
  250.                 case LOG_ACTION_WRITE_LARGE_SLOTS:
  251.                     undoWriteLargeSlots(recordHeader);
  252.                     break;
  253.  
  254.                 case LOG_ACTION_APPEND_LARGE_SLOTS:
  255.                 case LOG_ACTION_INSERT_LARGE_SLOTS:
  256.                     undoAppendLargeSlots(recordHeader);
  257.                     break;
  258.  
  259.                 case LOG_ACTION_REMOVE_LARGE_SLOTS:
  260.                 case LOG_ACTION_DELETE_LARGE_SLOTS:
  261.                     undoRemoveLargeSlots(recordHeader);
  262.                     break;
  263.  
  264.                 case LOG_ACTION_CONVERT_TO_LARGEROOT:
  265.                     undoConvertToLargeRoot(recordHeader);
  266.                     break;
  267.  
  268.                 case LOG_ACTION_CONVERT_TO_LARGEHDR:
  269.                     undoConvertToLargeHdr(recordHeader);
  270.                     break;
  271.  
  272.                 case LOG_ACTION_CONVERT_TO_SMALL:
  273.                     undoConvertToSmall(recordHeader);
  274.                     break;
  275.  
  276.                 case LOG_ACTION_INCREMENT_SLOT_BYTECOUNTS:
  277.                 case LOG_ACTION_DECREMENT_SLOT_BYTECOUNTS:
  278.                     undoChangeSlotByteCounts(recordHeader);
  279.                     break;
  280.  
  281.                 case LOG_ACTION_BTREE_LOGIC_INSERT:
  282.                 case LOG_ACTION_BTREE_LOGIC_DELETE:
  283.                 case LOG_ACTION_BTREE_PHYSIC_INSERT:
  284.                 case LOG_ACTION_BTREE_PHYSIC_DELETE:
  285.                 case LOG_ACTION_BTREE_MODIFY_LINK:
  286.                 case LOG_ACTION_BTREE_MODIFY_VECTOR0:
  287.                 case LOG_ACTION_BTREE_MODIFY_LEVEL:
  288.                 case LOG_ACTION_BTREE_LOGIC_SET_OVERFLOW:
  289.                 case LOG_ACTION_BTREE_LOGIC_INCR_OIDCNT:
  290.                 case LOG_ACTION_BTREE_LOGIC_DECR_OIDCNT:
  291.                     undoBtree(recordHeader);
  292.                     break;
  293.                     
  294.                 case LOG_ACTION_BTOV_MODIFY_NEXT_LINK:
  295.                 case LOG_ACTION_BTOV_MODIFY_PREV_LINK:
  296.                 case LOG_ACTION_BTOV_INSERT:
  297.                 case LOG_ACTION_BTOV_DELETE:
  298.                     undoBtOv(recordHeader);
  299.                     break;
  300.                     
  301.                 case LOG_ACTION_CREATE_INDEX:
  302.                     undoCreateIndex(recordHeader);
  303.                     break;
  304.  
  305.  
  306.                 case LOG_ACTION_LHASH_DIRPAGE_FORMAT:
  307.                 case LOG_ACTION_LHASH_INDEXPAGE_FORMAT:
  308.                 case LOG_ACTION_LHASH_DIRPAGE_INIT:
  309.                 case LOG_ACTION_LHASH_INDEXPAGE_INIT:
  310.                 case LOG_ACTION_LHASH_PHYSIC_INSERT:
  311.                 case LOG_ACTION_LHASH_PHYSIC_DELETE:
  312.                 case LOG_ACTION_LHASH_PHYLOG_INSERT:
  313.                 case LOG_ACTION_LHASH_PHYLOG_DELETE:
  314.                 case LOG_ACTION_LHASH_LOGIC_INSERT:
  315.                 case LOG_ACTION_LHASH_LOGIC_DELETE:
  316.                 case LOG_ACTION_LHASH_SET_INDEX_OVERFLOW:
  317.                 case LOG_ACTION_LHASH_RESET_INDEX_OVERFLOW:
  318.                 case LOG_ACTION_LHASH_DIR_UPDATE:
  319.                 case LOG_ACTION_LHASH_DIR_LOAD_UPDATE:
  320.                 case LOG_ACTION_LHASH_DIR_SPLIT_RESET:
  321.                 case LOG_ACTION_LHASH_DIR_SET_NEXT_ENTRY:
  322.                 case LOG_ACTION_LHASH_DIR_ROOT_CTRL:
  323.                 case LOG_ACTION_LHASH_LOGIC_INCR_OIDCNT:
  324.                 case LOG_ACTION_LHASH_LOGIC_DECR_OIDCNT:
  325.                 case LOG_ACTION_LHASH_LOGIC_SET_OVERFLOW:
  326.                 case LOG_ACTION_LHASH_LOGIC_RESET_OVERFLOW:
  327.                 case LOG_ACTION_LHASH_OV_CONVERT:
  328.                 case LOG_ACTION_LHASH_SET_THRESHOLD:
  329.  
  330.                     undoLHash(recordHeader);
  331.                     break;
  332.  
  333.                 case LOG_ACTION_ENTIRE_SLOTTED:        
  334.                 case LOG_ACTION_ENTIRE_LARGE_NODE:
  335.                 case LOG_ACTION_ENTIRE_LARGE_DATA:
  336.                 case LOG_ACTION_ENTIRE_BTREE_PAGE:
  337.                 case LOG_ACTION_ENTIRE_INDEXDESC:
  338.                     undoEntirePage(recordHeader);
  339.                     break;
  340.  
  341.                 case LOG_ACTION_NO_LARGE_OBJ_ON_PAGE:
  342.                 default:
  343. printf(" log action: %d \n", recordHeader->action);
  344.                     SM_ERROR(TYPE_FATAL, esmINTERNAL);
  345.                     break;
  346.             }
  347.             break;
  348.  
  349.         
  350.         case LOG_REC_TYPE_COMPENSATION:
  351.  
  352.             TRPRINT(TR_LOG, TR_LEVEL_2, ("compensation record"));
  353.             return;
  354.  
  355.         default:
  356.  
  357.             TRPRINT(TR_RECOVER, TR_LEVEL_1, ("unexpected rec type %d", 
  358.                 recordHeader->type));    
  359.             SM_ERROR(TYPE_FATAL, esmINTERNAL);
  360.             break;
  361.     }
  362.  
  363.     SANITY; /* check stacks */
  364. }
  365.